{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# UML\n",
    "\n",
    "* UMLはモデリング言語\n",
    "    * モデリングとは\n",
    "        * 言葉で表現しきれない抽象的・複雑・あいまいな対象を、目的に合わないもの除きシンプルにした上で、「模型」や「図」など視覚的に表現すること\n",
    "        * イメージを明確にでき、対象としている事柄をより的確に捕らえることができる\n",
    "    * ソフトウェア開発におけるモデリング\n",
    "        * ソフトウェアや運用の流れを図で表現する\n",
    "            * 「処理」や「運用の流れ」「手順」など、複雑でわかりにくい対象を、「図」で視覚的に表現する\n",
    "* UMLとは\n",
    "    * Unified Modeling Languageの略で、モデリングを行う際に使用する表記法\n",
    "        * システムを可視化したり、仕様や設計を文書化したりするための表現方法\n",
    "        * 特に、オブジェクト指向に基づいてモデリングを行った結果を表現する目的で規定された\n",
    "* UMLの特徴\n",
    "    * 標準化されている\n",
    "    * 理解しやすい\n",
    "    * 表現力が高い\n",
    "* ダイアグラム\n",
    "    * UML用の図\n",
    "        * 目的によって使うダイアグラムは違う\n",
    "\n",
    "| ダイアグラム | 目的 |\n",
    "|---|---|\n",
    "|ユースケース図|ユーザがシステムに要求する機能や振る舞いを表現する|\n",
    "|クラス図|クラス間の静的なつながりを表現する|\n",
    "|オブジェクト図|オブジェクト間の静的なつながりを表現する|\n",
    "|シーケンス図（相互作用図）|オブジェクト間の協調動作を時系列で表現する|\n",
    "|コラボレーション図（相互作用図）|オブジェクト間の協調動作を平面的に表現する|\n",
    "|ステートチャート図|特定のオブジェクトの状態の変化を表現する|\n",
    "|アクティビティ図|ひとまとまりの手順の流れを表現する|\n",
    "|コンポーネント図|プログラム間の依存関係を表現する|\n",
    "\n",
    "* 用語\n",
    "    * アトリビュート(属性)\n",
    "        * Javaではフィールド\n",
    "    * オペレーション(操作)\n",
    "        * Javaではメソッド\n",
    "* 参考\n",
    "    * 仕様\n",
    "        * [UML Resource Page](http://www.omg.org/uml/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## PlantUML\n",
    "\n",
    "UMLを手早く書くためのオープンソースプロジェクト\n",
    "\n",
    "* [PlantUML](http://plantuml.com/)\n",
    "    * [Web上で実行](http://plantuml.com/starting)\n",
    "        * ここの「online server」のリンクからアクセス\n",
    "* [PlantUML Cheat Sheet](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)\n",
    "\n",
    "### 図の貼り付け方\n",
    "```\n",
    "[![alt](下の方の「You can enter here a previously generated URL」のアドレス)](ブラウザのアドレスバーのアドレス)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## クラス図 (Class Diagram)\n",
    "\n",
    "* クラス図\n",
    "    * クラスやインスタンス、インタフェースなどの静的な関係を表現したもの\n",
    "        * クラス以外のものも登場する\n",
    "\n",
    "### Javaプログラムと対応するクラス階層関係図の例\n",
    "\n",
    "```\n",
    "================================================\n",
    "abstract class ParentClass {\n",
    "    int field1;\n",
    "    static char field2;\n",
    "    abstract void methodA();\n",
    "    double methodB() {\n",
    "        // ...\n",
    "    }\n",
    "}\n",
    "     \n",
    "class ChildClass extends ParentClass {\n",
    "    void methodA() {\n",
    "        // ...\n",
    "    }\n",
    "    static void methodC() {\n",
    "        // ...\n",
    "    }\n",
    "}\n",
    "================================================\n",
    "```\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/ROwx3i8m34NtV8L7EbG2HiJI1YGg8K0yFi1DWchH1qeC0wN_JjG8b05Fje_llNOtQkzeiG5LetCPiwNomQPGNNkYbu6f45WwjgWudC01hMbPZdqlmDULJArdi81YTnuNlMDaKaCWSq_a9Zi6z7KRuDcHXiPmrUbiaemqJFaayPBL_f9lrs8G8kJAYceTn_xH_u8Z9Ztp9l7RotUQHduV)](http://www.plantuml.com/plantuml/uml/RP3F2i8m3CRlVOeSjyD0FOg7RLLm82h-UO2khQpOTT9c7fnxTykAqeCv9VabtnUIEsGM-rOJTrVcmInhWMlcN85eLTsZh7XdpkebOKO8gnrQnZ6Cm95PQP1E-K30nqr9BUQmX6f_cHg3rqV5nq0Mdj1jSGhegpR2irC2MebD9ueadMYeoYJrA-l3jTnjo4X8yAMDqYAs_RF_CuuOzSoBn6UltbaMwP5S6k6_yG40)\n",
    "\n",
    "<!--\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "\n",
    "abstract class ParentClass {\n",
    "    field1 : INT\n",
    "    {static} field2 : CHAR\n",
    "    {abstract} void methodA()\n",
    "    methodB() : DOUBLE\n",
    "}\n",
    "\n",
    "class ChildClass {\n",
    "    void methodA()\n",
    "    {static} void methodC()\n",
    "}\n",
    "\n",
    "ParentClass <|-- ChildClass\n",
    "@enduml\n",
    "-->\n",
    "\n",
    "* ParentClassとChildClassの2つのクラスの関係を表している\n",
    "* 白抜きの矢印はクラスの階層関係を表す\n",
    "    * サブクラスからスーパークラスへ向かっている\n",
    "        * スーパークラスの別の呼び方\n",
    "            * 基底クラス、親クラス\n",
    "        * サブクラスの別の呼び方\n",
    "            * 派生クラス、子クラス、拡張クラス\n",
    "* 各々のクラスは長方形で表される\n",
    "    * 長方形の中は水平線で分割され、上から順に以下のものが書かれる\n",
    "        * クラスの名前\n",
    "        * フィールドの名前\n",
    "        * メソッドの名前\n",
    "* 名前だけではなく付加的な情報を書くこともある\n",
    "    * アクセス制御やメソッドの引数\n",
    "    * 必要のない項目は省略することもある\n",
    "* クラスやフィールドの書き方\n",
    "    * abstractクラス(抽象クラス)\n",
    "        * 斜体\n",
    "        * ここではParentClass\n",
    "    * staticフィールド(クラスフィールド)\n",
    "        * 下線\n",
    "        * ここではfield2\n",
    "    * abstractメソッド(抽象メソッド)\n",
    "        * 斜体\n",
    "        * ここではParentClassのmethodA\n",
    "    * staticメソッド(クラスメソッド)\n",
    "        * 下線\n",
    "        * ここではChildClassのmethodC"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## インタフェースと実装\n",
    "\n",
    "\n",
    "### インタフェースと実装クラスの例\n",
    "\n",
    "```\n",
    "================================================\n",
    "interface Printable {\n",
    "    abstract void print();\n",
    "    abstract void newPage();\n",
    "}\n",
    "\n",
    "class PrintClass implements Printable {\n",
    "    void print() {\n",
    "        // ...\n",
    "    }\n",
    "    void newPage() {\n",
    "        //...\n",
    "    }\n",
    "}\n",
    "================================================\n",
    "```\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/AyxEp2j8B4hCLKZEIImkTYmfASfCAYr9zKpEpmlEh4fLCE3YoimhIIrAIqnELGWe0h8Jat9I5Qgv582WEZ6fkAGeCRcaLg4iFpD5eG0ahw69LIuljJmWCJqLA5lBnGMs36ASCvW9CG_344oT22VOrEZf8Ha10000)](http://www.plantuml.com/plantuml/uml/ROz13e9034NtFKMNkY4Um0N6bJiIJz0PYcaS1j8fceZSdH4Mcc1NFtdfQt-PZDI6Da2wI-n9gKKVAAMJcOeRZ2--YrTvCHu091fhGvwnqfp91SOHCCz8BfcIjmaVdTJOV_Xk_vT5VbPquqmdWENOgZilSVLj9DlDxml7Tr7yAA3aMETACm00)\n",
    "\n",
    "<!--\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "\n",
    "interface Printable {\n",
    "    {abstract} void print()\n",
    "    {abstract} void newPage()\n",
    "}\n",
    "\n",
    "class PrintClass {\n",
    "    void print()\n",
    "    void newPage()\n",
    "}\n",
    "\n",
    "Printable <|.. PrintClass\n",
    "@enduml\n",
    "-->\n",
    "\n",
    "* インタフェース\n",
    "    * 一般的には名前を斜体にしない\n",
    "        * 本によっては抽象クラスとの類似性を強調するためにインタフェース名を斜体にしているものもある\n",
    "        * UMLでJavaのインタフェースを表現する場合 `<<interface>>` と書く\n",
    "        * PlantUMLは○の中にI\n",
    "    * ここではPrintable\n",
    "* インタフェースを実装しているクラス\n",
    "    * ここではPrintClass\n",
    "* 白抜きの破線矢印\n",
    "    * インタフェースと実装クラスの関係を表す\n",
    "    * implementsの矢印"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## 集約(aggregation)\n",
    "\n",
    "\n",
    "```\n",
    "================================================\n",
    "class Color {\n",
    "    // ...\n",
    "}\n",
    "\n",
    "class Fruit {\n",
    "    Color color;\n",
    "    // ...\n",
    "}\n",
    "\n",
    "class Basket {\n",
    "    Fruit[] fruits;\n",
    "    // ...\n",
    "}\n",
    "================================================\n",
    "```\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/AyxEp2j8B4hCLKZEIImkTYmfASfCAYr9zKpEpmlEh4fLCE3Y0iieEEVdv1SfL7FLmWJSYaepIu022a2G39QqWYX2A75ABCvEXQb90wal1Ye2QuoE1Ic366gZgviFDOuBGe558Be1)](http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuIhEpimhI2nAp5L8paaiBdOiAIdAJ2ejIVLCpiyBpgnALJ3WuWBBA3Zdv-GNALHprS84t8fACqk00Wf0a0oMj88eGYXnIYpEJeMfIGEfBmOg0ckCZWKfWnXgewkR3pME2qA1HI2wkHnIyrA0JWK0)\n",
    "\n",
    "<!--\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "\n",
    "class Color {\n",
    "}\n",
    "\n",
    "class Fruit {\n",
    "    color : Color\n",
    "}\n",
    "\n",
    "class Basket {\n",
    "    fruits : Fruit[]\n",
    "}\n",
    "\n",
    "Color <--o Fruit \n",
    "Fruit <--o Basket\n",
    "@enduml\n",
    "-->\n",
    "\n",
    "* Basketクラス\n",
    "    * fruitsフィールドはFruitクラスの配列になっている\n",
    "    * BasketクラスのインスタンスはFruitクラスのインスタンスを複数持つ\n",
    "* Fruitクラス\n",
    "    * colorフィールドはColorクラス型になっている\n",
    "    * FruitクラスのインスタンスはColorクラスのインスタンスを1個持つ\n",
    "* ようするに\n",
    "    * バスケットにフルーツが複数個入っていて、各フルーツのそれぞれに色がついているという関係を表している\n",
    "* 集約\n",
    "    * 「持っている」関係のこと\n",
    "    * インスタンスを持っていれば個数に関わらずその関係は集約\n",
    "        * 配列を使っていても、他のどのような実装であっても、インスタンスを持っていればその関係は集約\n",
    "    * 白抜きのひし形が付いた線で集約を表す"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## アクセス制御\n",
    "\n",
    "```\n",
    "================================================\n",
    "class Something {\n",
    "    private     int privateField;\n",
    "    protected int protectedField;\n",
    "    public      int publicField;\n",
    "    int packageField;\n",
    "    private     void privateMethod() {\n",
    "    }\n",
    "    protected  void protectedMethod() {\n",
    "    }\n",
    "    public       void publicMethod() {\n",
    "    }\n",
    "    void packageMethod() {\n",
    "    }\n",
    "}    \n",
    "================================================\n",
    "```\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/NSsn2i8m4CRnFKznuA8KmTdDHUYWIts1D3dgqJG9oRM3Of_TsWGXlV7xmVrZJzRB80TGHiPuOGxKZeorShQX5y99Y5MWSGFoasm7Rm7B7NsWIJ9U2Os6CzJtnxhlV72CYb5lfVBK6bBRUVPIzR8h7gN2v4X3pjoMkDFxGsfaoQ72gcJZBrN0d235_lBv0W00)](http://www.plantuml.com/plantuml/uml/NT2n2i8m483XFKznuA8KmTcfBa87NUeBfCbHZwP9IAuT5FlingO8xOttmVrmPMGPUEYDY1rPBuFiGHaPuuKvK3CmLihPcbu89o5cWThro4-oBRm5f3dwGADal18Q3MUexezvl_F1CIf6lPN2KsD8RTUJbwgJxUfGBeoED2oPMuexlJ_anY9BQ6L5jk6NMi6K8SV-yX4bMfrUyGK0)\n",
    "\n",
    "<!--\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "\n",
    "class Something {\n",
    "    -privateField : INT\n",
    "    #protectedField : INT\n",
    "    +piblicField : INT\n",
    "    ~packageField : INT\n",
    "\n",
    "    -void privateMethod()\n",
    "    #void protectedMethod()\n",
    "    +void publicMethod()\n",
    "    ~void packageMethod()\n",
    "}\n",
    "@enduml\n",
    "-->\n",
    "\n",
    "* アクセス制御子\n",
    "    * UMLではアクセス制御を表現する場合メソッドやフィールドの名前の前に記号をつける\n",
    "        * `+` : publicなメソッドやフィールドを表す。どこからでもアクセス可能\n",
    "        * `-` : privateなメソッドやフィールドを表す。クラスの外からアクセスすることはできない\n",
    "        * `#` : protectedなメソッドやフィールドを表す。同じクラス、サブクラス、同じパッケージ内のクラスはアクセスできる\n",
    "        * `~` : 同じパッケージ内からのみアクセスできるメソッドやフィールドを表す。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## クラスの関連\n",
    "\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/LOr12i8m44NtESLSeE0wYu8K13SgL0-Gn56YDP6PYQ3YtIMXaRXzx_C-Ntsu6p8tS9DXNegGjqbmxM8O_GjXeLGnC4mUWy1RVMQmDtJ65goCaqZFXkme7fDhDsEo5_mZMyj83wI2rFpITNtjQpWmClIgvhEhOGq3eP7YQphxNrJ39ee_-Rpu0W00)](http://www.plantuml.com/plantuml/uml/LOz12i9034NtSufSG73THQaK13SgL0-GJgECjZEIP0GLxwuTEbAtxtrUI2MAh77eZLoTlo7Z0BP7aPKgkpOgRMpmZNiIB8r91khUaLTucVS43iXdceCrMWtyc94zXoxQ-QQ9xON-oAuLuZjnGcQwibYKkL_0KKYWD3a_kXmke6P2JJwdH_-B5h0DwaukBIhotVVf3m00)\n",
    "\n",
    "<!--\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "\n",
    "class Client {\n",
    "}\n",
    "class Target {\n",
    "}\n",
    "class Factory {\n",
    "}\n",
    "class Product {\n",
    "}\n",
    "class Subject {\n",
    "}\n",
    "class Observer {\n",
    "}\n",
    "\n",
    "Client -x-> Target : Uses >\n",
    "Factory -x-> Product : Creates >\n",
    "Subject -x-> Observer : Notifies >\n",
    "@enduml\n",
    "-->\n",
    "\n",
    "* 関連の名前に黒三角をつけて表記する\n",
    "    * ClientがTargetを使用する\n",
    "    * FactoryがProductを生成する\n",
    "    * SubjectがObserverに通知する"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Ruby on Railsだとこんな感じ？\n",
    "\n",
    "[![alt](http://www.plantuml.com/plantuml/png/ZLHDRnCn4Btlhx1o0gf4smj8gsgbAAKb1n1A8yHjvNWd6wjhUsLxLGBYa9wGwB7z3S2bKW_yeXNAts2zNoJxoSsQzsOydZVFwfho24lC40cnKbEj9Lt56kP4y2lw6P1jHPXSum0G4pw42fsTNOZG1-cww8k5yZHqURDQASUP2Qwb23C08QMn1kIWvUkFooom5f9v73CJ_31TpDvC5rcSu4XJmG-fckgmITCG2BbDm_DtowFGQLjPBZGeRqqXzEtJm-8dWMdNgzfvzZmFnmeQmR42xHrKCeICPDilCyfNgpw5Sq6o2JIHMVc2TlY2fczkXnQY4vepequxThxggmb413mLMNQrAnW3hklerLPfO8vpAKKS5M0Abtj2yYK8GVOlozHdb6VJKhCgfLYT4yfz-5JgeZRYfZnpg8v4GZhFKgT8WkTJ5M5DDcNCA_V3IvlogLco3isAPjvJ8E0uRu770qsD0_DwpnSahHrphSfuTMKJOcd5JTY6r8kL6-PXxXVdLzrLQlkORpuAOQqTD3gURx9x3F5Mn7h_-sv__vJiVlpvzcj__pFPFIItTydjzv5bjEoLQ39nwuPtKgLJzxZkVsSQavYiNCH6OeSGlLTRDKICnsXaJoOlHWUN3fDAamupZIc7MSQ1LM_csHsKNaPcydvAxlL-pZ_Bz_CAvmyK4vtN7NqHVm40)](http://www.plantuml.com/plantuml/uml/ZLLDRzD04BtxLwno0gf4xWKagx8QfRJa049fL76pDkj9ikf-MBjhbO0uf2SaUYo_0RWWSU0NHIX_Wrr_aTYnmsqrxytixBnvzhasM9cKCq_VKf5WXJaY36izD4RHMMfWJAIufXy0-Lw2oIrU0E8o1gRHsTcbP36eC4GVFPIdeQkxsKm7mKWAeoJB08Ji9GPGWAOltqspm5mg7WdCNV1cE1cz6awoEC69eLBiKWqrh4api91gPSFZDzEzqEcXia8QqD6S0elzqztY9mlNRbIry-Hf7aurD89z3IRQgUG86SdtdsUKJrvz2XUIP1De8gFo1OVXIshVV1YQo5Pep9qwXx6BMLTD878XhCYghLt9EGXJHwzNsW0FWYibqwG0BLpk2ScNW87gNfPXpAd8fgL7LKgnEYTKnF2-r4KlvLrv5b0TYG8xprAdH44KKvrWGvPbB2ht8x9DnTGjMOjcHJDlAH08WjSWqYDDzHVkzL4iYQsT2gFBU7Lb4-Asuf8TGkh5oWsBi8YByulsAhLzp3SVCPYR0FNsvxjP_sHu9LEp_VsmVVorMN_xy_d7zl7xPlrrS_-mkV_IyvoMdH8D1c7Ty85Lshed3Fyxqvd4PUKYDX9RXEYysgiXijz7FNymUDRRkVGugJJfSQOpvN6MSs3Lctjs2wMJaPcycv9xlPlpp_BTlCBvHuh9rklsFX7UEOZO_cp-0W00)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## シーケンス図 (Sequence Diagram)\n",
    "\n",
    "* 表現するもの・特徴\n",
    "    * どのメソッドがどの順番に実行されるか\n",
    "    * どのような事象がどういう順番で起きるか\n",
    "    * 複数のインスタンス間の振る舞いが図式化できる\n",
    "* クラス図との比較\n",
    "    * クラス図\n",
    "        * <font color=\"red\">時間によって変化しないもの(静的な関係)</font>を表す\n",
    "    * シーケンス図\n",
    "        * <font color=\"red\">時間に従って変化するもの(動的な振る舞い)</font>を表す\n",
    "* 見方\n",
    "    * ライフラインをたどりながら上から順番に読んでいく\n",
    "        * ライフライン (生存線)\n",
    "            * 個々のインスタンスから下方向に伸びている破線\n",
    "                * 時間は下方向に流れる\n",
    "                * インスタンスが存在する間だけ存在する\n",
    "            * ライフラインの途中にある細長い長方形\n",
    "                * オブジェクトが活動中であることを意味する\n",
    "    * 矢印があったらそれを追ってインスタンス間の協調動作を確認する"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "%%bash\n",
    "\n",
    "current_dir=`pwd`\n",
    "isbn=\"ISBN4-7973-2703-0\"\n",
    "fig=\"Fig.0-6\"\n",
    "\n",
    "### サンプルコードの作成\n",
    "cat <<- EOS > ${current_dir}/plantuml/${isbn}_${fig}.pu\n",
    "@startuml\n",
    "skinparam classAttributeIconSize 0\n",
    "skinparam sequenceParticipant underline\n",
    "\n",
    "actor User\n",
    "participant \":Client\" as A\n",
    "participant \":Server\" as B\n",
    "participant \":Device\" as C\n",
    "\n",
    "User -> A: work\n",
    "activate A\n",
    "\n",
    "A -> B: open\n",
    "activate B\n",
    "B --> A\n",
    "deactivate B\n",
    "\n",
    "A -> B: print\n",
    "activate B\n",
    "B -> C: write\n",
    "activate C\n",
    "C --> B\n",
    "deactivate C\n",
    "B --> A\n",
    "deactivate B\n",
    "\n",
    "A -> B: close\n",
    "activate B\n",
    "B --> A\n",
    "deactivate B\n",
    "\n",
    "A --> User\n",
    "deactivate A\n",
    "\n",
    "\n",
    "@enduml\n",
    "EOS\n",
    "\n",
    "### サンプルコードからUMLの図を作成\n",
    "java -jar plantuml.jar -o ${current_dir}/img -tpng ${current_dir}/plantuml/${isbn}_${fig}.pu"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "```\n",
    "================================================\n",
    "class Client {\n",
    "    Server server;\n",
    "    void work() {\n",
    "        server.open();\n",
    "        server.print(\"Hello\");\n",
    "        server.close();\n",
    "    }\n",
    "    // ...\n",
    "}\n",
    "\n",
    "class Server {\n",
    "    Device device;\n",
    "    void open() {\n",
    "        // ...\n",
    "    }\n",
    "    void print(String s) {\n",
    "        device.write(s);\n",
    "        // ...\n",
    "    }\n",
    "    void close() {\n",
    "        // ...\n",
    "    }\n",
    "    // ...\n",
    "}\n",
    "\n",
    "class Device {\n",
    "    void write (String s) {\n",
    "        // ...\n",
    "    }\n",
    "}\n",
    "================================================\n",
    "```\n",
    "\n",
    "<img src=\"img/ISBN4-7973-2703-0_Fig.0-6.png\" alt=\"シーケンス図の例\" title=\"シーケンス図の例\" align=\"left\" />  \n",
    "<br clear=\"left\">\n",
    "\n",
    "* インスタンス\n",
    "    * コロンの後にクラス名が書かれ、下線があるもの\n",
    "    * ここでは<u>:Client</u>, <u>:Server</u>, <u>:Device</u>\n",
    "    * 個々インスタンスに名前が必要な場合はコロンの前に名前を書く\n",
    "        * <u>server1:Server</u>\n",
    "* 実線横矢印\n",
    "    * メソッド呼び出し\n",
    "        * 例 : openのラベルが付いた矢印\n",
    "            * clientがserverのopenメソッドを呼び出している\n",
    "            * openメソッドを呼び出したので、serverインスタンスが活動中になる\n",
    "                * 細長い長方形がはじまる\n",
    "* 破線横矢印\n",
    "    * メソッドからのリターンを表す\n",
    "        * 例 : openの細長い長方形の下端の矢印\n",
    "            * 制御がclientに戻ったのでserverインスタンスの活動中の長方形はいったん終了している\n",
    "        * リターンがあっても省略されることもある\n",
    " "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
